//
//  UITextView+Extention.swift
//  01-表情键盘
//
//  Created by 002 on 15/10/26.
//  Copyright © 2015年 002. All rights reserved.
//

import UIKit

extension UITextView {
    
    // 图片表情完整字符串内容
    var emoticonText : String {
        
        var strM = String()
        
        let attrText = attributedText
        
        attrText.enumerateAttributesInRange(NSRange.init(location: 0, length: attrText.length), options: []) { (dict, range, _) -> Void in
            
            // - 如果字符串包含 NSAttachment 说明是图片
            // - 否则是字符串，可以通过 range 获得
            if let attachemtn = dict["NSAttachment"] as? EmoticonAttachment {
                strM += attachemtn.emoticon.chs ?? ""
            } else {
                strM += (attrText.string as NSString).substringWithRange(range)
            }
        }
        return strM
    }
    
    func insertEmoticon(emoticon : Emoticon) {
        //        self.textView.insertText(emoticon.chs!)
        
        // 1. 是空白按钮直接返回
        if emoticon.isEmpty {
            return
        }
        
        // 2. 是删除按钮执行苹果原声删除后返回
        if emoticon.isRemoved {
            deleteBackward()
            return
        }
        
        // 3. emoj 表情字符串
        if emoticon.emoji != nil {
            self.replaceRange(self.selectedTextRange!, withText: emoticon.emoji!)
            return
        }
        
        // 4. 图片表情
        insertImageEmoticon(emoticon)
        
        // 5. 通知 ‘代理’ 文本变化了 textViewDidChange? 表示代理如果没有实现方法，就什么都不做，更安全
        delegate?.textViewDidChange?(self)
    }
    
    // 插入图片表情
    private func insertImageEmoticon(emoticon : Emoticon) {
        print("\(emoticon)")
        
        // 1.图片属性的文本
        let attachment = EmoticonAttachment(emoticon: emoticon)
        attachment.image = UIImage(named: emoticon.imagePath)
        
        // 线高
        let lineHeight = font!.lineHeight
        attachment.bounds = CGRectMake(0, -4, lineHeight, lineHeight)
        
        // 获取图片文本
        let imageText = NSMutableAttributedString.init(attributedString: NSAttributedString.init(attachment: attachment))
        
        // 添加‘字体’属性
        imageText.addAttribute(NSFontAttributeName, value: font!, range: NSRange.init(location: 0, length: 1))
        
        // 2. 记录文本属性 - 转变为可变文本
        let strM = NSMutableAttributedString.init(attributedString: attributedText)
        
        // 3. 插入图片文本
        strM.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
        
        // 4. 替换属性文本
        // 1> 记录光标
        let range = selectedRange
        // 2> 替换文本
        attributedText = strM
        // 3> 恢复光标
        selectedRange = NSRange.init(location: range.location + 1, length: 0)
    }
    
}